<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Class template asynchronous_sink</title>
<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../../../index.html" title="Chapter 1. Boost.Log v2">
<link rel="up" href="../../../sinks.html#header.boost.log.sinks.async_frontend_hpp" title="Header &lt;boost/log/sinks/async_frontend.hpp&gt;">
<link rel="prev" href="../../../sinks.html" title="Sinks">
<link rel="next" href="asynchronous_sink/run_func.html" title="Class run_func">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../../../sinks.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../../sinks.html#header.boost.log.sinks.async_frontend_hpp"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="asynchronous_sink/run_func.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="refentry">
<a name="boost.log.sinks.asynchronous_sink"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2><span class="refentrytitle">Class template asynchronous_sink</span></h2>
<p>boost::log::sinks::asynchronous_sink — Asynchronous logging sink frontend. </p>
</div>
<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: &lt;<a class="link" href="../../../sinks.html#header.boost.log.sinks.async_frontend_hpp" title="Header &lt;boost/log/sinks/async_frontend.hpp&gt;">boost/log/sinks/async_frontend.hpp</a>&gt;

</span><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> SinkBackendT<span class="special">,</span> 
         <span class="keyword">typename</span> QueueingStrategyT <span class="special">=</span> <a class="link" href="unbounded_fifo_queue.html" title="Class unbounded_fifo_queue">unbounded_fifo_queue</a><span class="special">&gt;</span> 
<span class="keyword">class</span> <a class="link" href="asynchronous_sink.html" title="Class template asynchronous_sink">asynchronous_sink</a> <span class="special">:</span>
  <span class="keyword">public</span> <span class="identifier">basic_sink_frontend</span>, <span class="keyword">public</span> <span class="identifier">QueueingStrategyT</span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
  <span class="comment">// types</span>
  <span class="keyword">typedef</span> <span class="identifier">SinkBackendT</span>           <a name="boost.log.sinks.asynchronous_sink.sink_backend_type"></a><span class="identifier">sink_backend_type</span><span class="special">;</span>   <span class="comment">// Sink implementation type. </span>
  <span class="keyword">typedef</span> <span class="identifier">implementation_defined</span> <a name="boost.log.sinks.asynchronous_sink.locked_backend_ptr"></a><span class="identifier">locked_backend_ptr</span><span class="special">;</span>  <span class="comment">// A pointer type that locks the backend until it's destroyed. </span>

  <span class="comment">// member classes/structs/unions</span>

  <span class="comment">// Function object to run the log record feeding thread.</span>

  <span class="keyword">class</span> <a class="link" href="asynchronous_sink/run_func.html" title="Class run_func">run_func</a> <span class="special">{</span>
  <span class="keyword">public</span><span class="special">:</span>
    <span class="comment">// types</span>
    <span class="keyword">typedef</span> <span class="keyword">void</span> <a class="link" href="asynchronous_sink/run_func.html#boost.log.sinks.asynchronous_sink.run_func.result_type"><span class="identifier">result_type</span></a><span class="special">;</span>

    <span class="comment">// <a class="link" href="asynchronous_sink/run_func.html#boost.log.sinks.asynchronous_sink.run_funcconstruct-copy-destruct">construct/copy/destruct</a></span>
    <span class="keyword">explicit</span> <a class="link" href="asynchronous_sink/run_func.html#idm31890-bb"><span class="identifier">run_func</span></a><span class="special">(</span><a class="link" href="asynchronous_sink.html" title="Class template asynchronous_sink">asynchronous_sink</a> <span class="special">*</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>

    <span class="comment">// <a class="link" href="asynchronous_sink/run_func.html#idm31887-bb">public member functions</a></span>
    <span class="identifier">result_type</span> <a class="link" href="asynchronous_sink/run_func.html#idm31888-bb"><span class="keyword">operator</span><span class="special">(</span><span class="special">)</span></a><span class="special">(</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  <span class="special">}</span><span class="special">;</span>

  <span class="comment">// A scope guard that implements active operation management.</span>

  <span class="keyword">class</span> <a class="link" href="asynchronous_sink/scoped_feeding_opereation.html" title="Class scoped_feeding_opereation">scoped_feeding_opereation</a> <span class="special">{</span>
  <span class="keyword">public</span><span class="special">:</span>
    <span class="comment">// <a class="link" href="asynchronous_sink/scoped_feeding_opereation.html#boost.log.sinks.asynchronous_sink.scoped_feeding_opereationconstruct-copy-destruct">construct/copy/destruct</a></span>
    <span class="keyword">explicit</span> <a class="link" href="asynchronous_sink/scoped_feeding_opereation.html#idm31897-bb"><span class="identifier">scoped_feeding_opereation</span></a><span class="special">(</span><a class="link" href="asynchronous_sink.html" title="Class template asynchronous_sink">asynchronous_sink</a> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
    <a class="link" href="asynchronous_sink/scoped_feeding_opereation.html#idm31904-bb"><span class="identifier">scoped_feeding_opereation</span></a><span class="special">(</span><span class="identifier">scoped_feeding_opereation</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
    <span class="identifier">scoped_feeding_opereation</span> <span class="special">&amp;</span> 
    <a class="link" href="asynchronous_sink/scoped_feeding_opereation.html#idm31907-bb"><span class="keyword">operator</span><span class="special">=</span></a><span class="special">(</span><span class="identifier">scoped_feeding_opereation</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
    <a class="link" href="asynchronous_sink/scoped_feeding_opereation.html#idm31902-bb"><span class="special">~</span><span class="identifier">scoped_feeding_opereation</span></a><span class="special">(</span><span class="special">)</span><span class="special">;</span>
  <span class="special">}</span><span class="special">;</span>

  <span class="comment">// A scope guard that resets a flag on destructor.</span>

  <span class="keyword">class</span> <a class="link" href="asynchronous_sink/scoped_flag.html" title="Class scoped_flag">scoped_flag</a> <span class="special">{</span>
  <span class="keyword">public</span><span class="special">:</span>
    <span class="comment">// <a class="link" href="asynchronous_sink/scoped_flag.html#boost.log.sinks.asynchronous_sink.scoped_flagconstruct-copy-destruct">construct/copy/destruct</a></span>
    <span class="keyword">explicit</span> <a class="link" href="asynchronous_sink/scoped_flag.html#idm31914-bb"><span class="identifier">scoped_flag</span></a><span class="special">(</span><span class="identifier">frontend_mutex_type</span> <span class="special">&amp;</span><span class="special">,</span> <span class="identifier">condition_variable_any</span> <span class="special">&amp;</span><span class="special">,</span> 
                         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">atomic</span><span class="special">&lt;</span> <span class="keyword">bool</span> <span class="special">&gt;</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
    <a class="link" href="asynchronous_sink/scoped_flag.html#idm31922-bb"><span class="identifier">scoped_flag</span></a><span class="special">(</span><span class="identifier">scoped_flag</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
    <span class="identifier">scoped_flag</span> <span class="special">&amp;</span> <a class="link" href="asynchronous_sink/scoped_flag.html#idm31925-bb"><span class="keyword">operator</span><span class="special">=</span></a><span class="special">(</span><span class="identifier">scoped_flag</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
    <a class="link" href="asynchronous_sink/scoped_flag.html#idm31921-bb"><span class="special">~</span><span class="identifier">scoped_flag</span></a><span class="special">(</span><span class="special">)</span><span class="special">;</span>
  <span class="special">}</span><span class="special">;</span>

  <span class="comment">// <a class="link" href="asynchronous_sink.html#boost.log.sinks.asynchronous_sinkconstruct-copy-destruct">construct/copy/destruct</a></span>
  <span class="keyword">explicit</span> <a class="link" href="asynchronous_sink.html#idm31996-bb"><span class="identifier">asynchronous_sink</span></a><span class="special">(</span><span class="keyword">bool</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">)</span><span class="special">;</span>
  <span class="keyword">explicit</span> <a class="link" href="asynchronous_sink.html#idm32009-bb"><span class="identifier">asynchronous_sink</span></a><span class="special">(</span><span class="identifier">shared_ptr</span><span class="special">&lt;</span> <span class="identifier">sink_backend_type</span> <span class="special">&gt;</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="special">,</span> 
                             <span class="keyword">bool</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">)</span><span class="special">;</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span><span class="special">...</span> Args<span class="special">&gt;</span> <span class="keyword">explicit</span> <a class="link" href="asynchronous_sink.html#idm32030-bb"><span class="identifier">asynchronous_sink</span></a><span class="special">(</span><span class="identifier">Args</span> <span class="special">&amp;&amp;</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
  <a class="link" href="asynchronous_sink.html#idm32047-bb"><span class="special">~</span><span class="identifier">asynchronous_sink</span></a><span class="special">(</span><span class="special">)</span><span class="special">;</span>

  <span class="comment">// <a class="link" href="asynchronous_sink.html#idm31935-bb">public member functions</a></span>
  <span class="identifier">locked_backend_ptr</span> <a class="link" href="asynchronous_sink.html#idm31936-bb"><span class="identifier">locked_backend</span></a><span class="special">(</span><span class="special">)</span><span class="special">;</span>
  <span class="keyword">virtual</span> <span class="keyword">void</span> <a class="link" href="asynchronous_sink.html#idm31940-bb"><span class="identifier">consume</span></a><span class="special">(</span><span class="identifier">record_view</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
  <span class="keyword">virtual</span> <span class="keyword">bool</span> <a class="link" href="asynchronous_sink.html#idm31946-bb"><span class="identifier">try_consume</span></a><span class="special">(</span><span class="identifier">record_view</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
  <span class="keyword">void</span> <a class="link" href="asynchronous_sink.html#idm31952-bb"><span class="identifier">run</span></a><span class="special">(</span><span class="special">)</span><span class="special">;</span>
  <span class="keyword">void</span> <a class="link" href="asynchronous_sink.html#idm31965-bb"><span class="identifier">stop</span></a><span class="special">(</span><span class="special">)</span><span class="special">;</span>
  <span class="keyword">void</span> <a class="link" href="asynchronous_sink.html#idm31984-bb"><span class="identifier">feed_records</span></a><span class="special">(</span><span class="special">)</span><span class="special">;</span>
  <span class="keyword">virtual</span> <span class="keyword">void</span> <a class="link" href="asynchronous_sink.html#idm31991-bb"><span class="identifier">flush</span></a><span class="special">(</span><span class="special">)</span><span class="special">;</span>
<span class="special">}</span><span class="special">;</span></pre></div>
<div class="refsect1">
<a name="idm62881"></a><h2>Description</h2>
<p>The frontend starts a separate thread on construction. All logging records are passed to the backend in this dedicated thread.</p>
<p>The user can prevent spawning the internal thread by specifying <code class="computeroutput">start_thread</code> parameter with the value of <code class="computeroutput">false</code> on construction. In this case log records will be buffered in the internal queue until the user calls <code class="computeroutput">run</code>, <code class="computeroutput">feed_records</code> or <code class="computeroutput">flush</code> in his own thread. Log record queueing strategy is specified in the <code class="computeroutput">QueueingStrategyT</code> template parameter. </p>
<div class="refsect2">
<a name="idm62891"></a><h3>
<a name="boost.log.sinks.asynchronous_sinkconstruct-copy-destruct"></a><code class="computeroutput">asynchronous_sink</code> 
        public
       construct/copy/destruct</h3>
<div class="orderedlist"><ol class="orderedlist" type="1">
<li class="listitem">
<pre class="literallayout"><span class="keyword">explicit</span> <a name="idm31996-bb"></a><span class="identifier">asynchronous_sink</span><span class="special">(</span><span class="keyword">bool</span> start_thread <span class="special">=</span> <span class="keyword">true</span><span class="special">)</span><span class="special">;</span></pre>
<p>Default constructor. Constructs the sink backend instance. Requires the backend to be default-constructible.</p>
<p>
</p>
<div class="variablelist"><table border="0" class="variablelist compact">
<colgroup>
<col align="left" valign="top">
<col>
</colgroup>
<tbody><tr>
<td><p><span class="term">Parameters:</span></p></td>
<td><div class="variablelist"><table border="0" class="variablelist compact">
<colgroup>
<col align="left" valign="top">
<col>
</colgroup>
<tbody><tr>
<td><p><span class="term"><code class="computeroutput">start_thread</code></span></p></td>
<td><p>If <code class="computeroutput">true</code>, the frontend creates a thread to feed log records to the backend. Otherwise no thread is started and it is assumed that the user will call <code class="computeroutput">run</code>, <code class="computeroutput">feed_records</code> or <code class="computeroutput">flush</code> himself. </p></td>
</tr></tbody>
</table></div></td>
</tr></tbody>
</table></div>
</li>
<li class="listitem">
<pre class="literallayout"><span class="keyword">explicit</span> <a name="idm32009-bb"></a><span class="identifier">asynchronous_sink</span><span class="special">(</span><span class="identifier">shared_ptr</span><span class="special">&lt;</span> <span class="identifier">sink_backend_type</span> <span class="special">&gt;</span> <span class="keyword">const</span> <span class="special">&amp;</span> backend<span class="special">,</span> 
                           <span class="keyword">bool</span> start_thread <span class="special">=</span> <span class="keyword">true</span><span class="special">)</span><span class="special">;</span></pre>
<p>Constructor attaches user-constructed backend instance</p>
<p>

</p>
<div class="variablelist"><table border="0" class="variablelist compact">
<colgroup>
<col align="left" valign="top">
<col>
</colgroup>
<tbody>
<tr>
<td><p><span class="term">Parameters:</span></p></td>
<td><div class="variablelist"><table border="0" class="variablelist compact">
<colgroup>
<col align="left" valign="top">
<col>
</colgroup>
<tbody>
<tr>
<td><p><span class="term"><code class="computeroutput">backend</code></span></p></td>
<td><p>Pointer to the backend instance. </p></td>
</tr>
<tr>
<td><p><span class="term"><code class="computeroutput">start_thread</code></span></p></td>
<td><p>If <code class="computeroutput">true</code>, the frontend creates a thread to feed log records to the backend. Otherwise no thread is started and it is assumed that the user will call <code class="computeroutput">run</code>, <code class="computeroutput">feed_records</code> or <code class="computeroutput">flush</code> himself.</p></td>
</tr>
</tbody>
</table></div></td>
</tr>
<tr>
<td><p><span class="term">Requires:</span></p></td>
<td><p><span class="emphasis"><em>backend</em></span> is not <code class="computeroutput">NULL</code>. </p></td>
</tr>
</tbody>
</table></div>
</li>
<li class="listitem">
<pre class="literallayout"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span><span class="special">...</span> Args<span class="special">&gt;</span> <span class="keyword">explicit</span> <a name="idm32030-bb"></a><span class="identifier">asynchronous_sink</span><span class="special">(</span><span class="identifier">Args</span> <span class="special">&amp;&amp;</span><span class="special">...</span> args<span class="special">)</span><span class="special">;</span></pre>
<p>Constructor that passes arbitrary named parameters to the interprocess sink backend constructor. Refer to the backend documentation for the list of supported parameters.</p>
<p>The frontend uses the following named parameters:</p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>start_thread - If <code class="computeroutput">true</code>, the frontend creates a thread to feed log records to the backend. Otherwise no thread is started and it is assumed that the user will call <code class="computeroutput">run</code>, <code class="computeroutput">feed_records</code> or <code class="computeroutput">flush</code> himself. </p></li></ul></div>
<p>
</p>
</li>
<li class="listitem">
<pre class="literallayout"><a name="idm32047-bb"></a><span class="special">~</span><span class="identifier">asynchronous_sink</span><span class="special">(</span><span class="special">)</span><span class="special">;</span></pre>
<p>Destructor. Implicitly stops the dedicated feeding thread, if one is running. </p>
</li>
</ol></div>
</div>
<div class="refsect2">
<a name="idm63007"></a><h3>
<a name="idm31935-bb"></a><code class="computeroutput">asynchronous_sink</code> public member functions</h3>
<div class="orderedlist"><ol class="orderedlist" type="1">
<li class="listitem">
<pre class="literallayout"><span class="identifier">locked_backend_ptr</span> <a name="idm31936-bb"></a><span class="identifier">locked_backend</span><span class="special">(</span><span class="special">)</span><span class="special">;</span></pre>
<p>Locking accessor to the attached backend </p>
</li>
<li class="listitem">
<pre class="literallayout"><span class="keyword">virtual</span> <span class="keyword">void</span> <a name="idm31940-bb"></a><span class="identifier">consume</span><span class="special">(</span><span class="identifier">record_view</span> <span class="keyword">const</span> <span class="special">&amp;</span> rec<span class="special">)</span><span class="special">;</span></pre>
<p>Enqueues the log record to the backend </p>
</li>
<li class="listitem">
<pre class="literallayout"><span class="keyword">virtual</span> <span class="keyword">bool</span> <a name="idm31946-bb"></a><span class="identifier">try_consume</span><span class="special">(</span><span class="identifier">record_view</span> <span class="keyword">const</span> <span class="special">&amp;</span> rec<span class="special">)</span><span class="special">;</span></pre>
<p>The method attempts to pass logging record to the backend </p>
</li>
<li class="listitem">
<pre class="literallayout"><span class="keyword">void</span> <a name="idm31952-bb"></a><span class="identifier">run</span><span class="special">(</span><span class="special">)</span><span class="special">;</span></pre>
<p>The method starts record feeding loop and effectively blocks until either of this happens:</p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem"><p>the thread is interrupted due to either standard thread interruption or a call to <code class="computeroutput">stop</code> </p></li>
<li class="listitem"><p>an exception is thrown while processing a log record in the backend, and the exception is not terminated by the exception handler, if one is installed</p></li>
</ul></div>
<p>

</p>
<div class="variablelist"><table border="0" class="variablelist compact">
<colgroup>
<col align="left" valign="top">
<col>
</colgroup>
<tbody><tr>
<td><p><span class="term">Requires:</span></p></td>
<td><p>The sink frontend must be constructed without spawning a dedicated thread </p></td>
</tr></tbody>
</table></div>
</li>
<li class="listitem">
<pre class="literallayout"><span class="keyword">void</span> <a name="idm31965-bb"></a><span class="identifier">stop</span><span class="special">(</span><span class="special">)</span><span class="special">;</span></pre>
<p>The method softly interrupts record feeding loop. This method must be called when <code class="computeroutput">run</code>, <code class="computeroutput">feed_records</code> or <code class="computeroutput">flush</code> method execution has to be interrupted. Unlike regular thread interruption, calling <code class="computeroutput">stop</code> will not interrupt the record processing in the middle. Instead, the sink frontend will attempt to finish its business with the record in progress and return afterwards. This method can be called either if the sink was created with an internal dedicated thread, or if the feeding loop was initiated by user.</p>
<p>If no record feeding operation is in progress, calling <code class="computeroutput">stop</code> marks the sink frontend so that the next feeding operation stops immediately.</p>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>Returning from this method does not guarantee that there are no records left buffered in the sink frontend. It is possible that log records keep coming during and after this method is called. At some point of execution of this method log records stop being processed, and all records that come after this point are put into the queue. These records will be processed upon further calls to <code class="computeroutput">run</code> or <code class="computeroutput">feed_records</code>.</p></td></tr>
</table></div>
<p>
</p>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>If the record feeding loop is being run in a user's thread (i.e. <code class="computeroutput">start_thread</code> was specified as <code class="computeroutput">false</code> on frontend construction), this method does not guarantee that upon return the thread has returned from the record feeding loop or that it won't enter it in the future. The method only ensures that the record feeding thread will eventually return from the feeding loop. It is user's responsibility to synchronize with the user's record feeding thread. </p></td></tr>
</table></div>
<p>
</p>
</li>
<li class="listitem">
<pre class="literallayout"><span class="keyword">void</span> <a name="idm31984-bb"></a><span class="identifier">feed_records</span><span class="special">(</span><span class="special">)</span><span class="special">;</span></pre>
<p>The method feeds log records that may have been buffered to the backend and returns</p>
<p>
</p>
<div class="variablelist"><table border="0" class="variablelist compact">
<colgroup>
<col align="left" valign="top">
<col>
</colgroup>
<tbody><tr>
<td><p><span class="term">Requires:</span></p></td>
<td><p>The sink frontend must be constructed without spawning a dedicated thread </p></td>
</tr></tbody>
</table></div>
</li>
<li class="listitem">
<pre class="literallayout"><span class="keyword">virtual</span> <span class="keyword">void</span> <a name="idm31991-bb"></a><span class="identifier">flush</span><span class="special">(</span><span class="special">)</span><span class="special">;</span></pre>
<p>The method feeds all log records that may have been buffered to the backend and returns. Unlike <code class="computeroutput">feed_records</code>, in case of ordering queueing the method also feeds records that were enqueued during the ordering window, attempting to drain the queue completely. </p>
</li>
</ol></div>
</div>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2007-2021 Andrey Semashev<p>
        Distributed under the Boost Software License, Version 1.0. (See accompanying
        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>).
      </p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../../../sinks.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../../sinks.html#header.boost.log.sinks.async_frontend_hpp"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="asynchronous_sink/run_func.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
